package servlet;

import com.fasterxml.jackson.databind.ObjectMapper;
import common.AppConfig;
import common.AppResult;
import dao.BlogDao;
import dao.UserDao;
import model.Blog;
import model.User;
import utills.StringUtils;
import utills.UserUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @Author quan
 * @Description 功能2：获取当前用户的登录信息，设置给用户显示控件
 * @Date 2023/7/4 16:19
 */
@WebServlet("/user")
public class UserServlet extends HttpServlet {
    ObjectMapper objectMapper = new ObjectMapper();
    private UserDao userDao = new UserDao();
    private BlogDao blogDao = new BlogDao();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、设置编码格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset = utf-8");
        //定义统一返回的数据类型
        AppResult appResult;
        //2、获取session对象
        HttpSession session = req.getSession(false);
        //3、判断session
        //如果session为空，说明用户没有登录,是不能获取当前的用户信息的
//        if(session == null || session.getAttribute(AppConfig.USER_SESSION_KEY) == null){
//            //设置HTTP状态码:403表示没有权限访问，在前端的时候会调用到error方法
//            resp.setStatus(403);
//            //返回错误信息
//            appResult = AppResult.failed("用户没有登录，请登录后再试！");
//            resp.getWriter().write(objectMapper.writeValueAsString(appResult));
//            //中断代码流程
//            return;
//        }
        //3、也可以直接调用工具类的方法
        if(UserUtils.checkUserLoginStatus(req) == null){
            //设置HTTP状态码:403表示没有权限访问，在前端的时候会调用到error方法
            resp.setStatus(403);
            //返回错误信息
            appResult = AppResult.failed("用户没有登录，请登录后再试！");
            resp.getWriter().write(objectMapper.writeValueAsString(appResult));
            //中断代码流程
            return;
        }
        //-----功能4实现：子页面对应显示用户信息：根据是否传入参数来判断执行哪个方法
        String blogId = req.getParameter("blog_Id");
        //定义返回的json格式
        String jsonStr = null;
        //（1）如果当前没有传入参数
        if(StringUtils.isEmpty(blogId)){
            //校验成功，获取用户信息
            User user = (User) session.getAttribute(AppConfig.USER_SESSION_KEY);
            //设置返回结果中的对象,返回对象
            jsonStr = objectMapper.writeValueAsString(AppResult.success(user));
        } else{
            //（2）说明当前传入了参数
            //先查询博客信息
            Blog blog = blogDao.selectById(Long.valueOf(blogId));
            //查询到的博客为空
            if(blog == null){
                jsonStr = objectMapper.writeValueAsString(AppResult.failed("没有找到对应的博客"));
                resp.getWriter().write(jsonStr);
                return;
            }
            //说明查到了博客信息，则根据博客表中的userId查询用户
            User user = userDao.selectById(blog.getUserId());
            //判断user是否为空
            if(user == null){
                jsonStr = objectMapper.writeValueAsString(AppResult.failed("没有找到对应的用户"));
                resp.getWriter().write(jsonStr);
                return;
            }
            //判断当前登录的用户是不是文章作者
            User currentUser = (User) session.getAttribute(AppConfig.USER_SESSION_KEY);
            if(currentUser.getId() == blog.getUserId()){
                //表示当前登录用户就是作者，设置user的isAuthor为True
                user.setAuthor(true);
            }
            //返回用户作者
            jsonStr = objectMapper.writeValueAsString(AppResult.success(user));
        }
        resp.getWriter().write(jsonStr);
    }
}
